package com.softer.chengxin.param.dao;

import com.softer.chengxin.param.dao.provider.ScoreTypeDaoProvider;
import com.softer.chengxin.param.entity.ScoreType;
import com.softer.chengxin.param.entity.ScoreTypeDetail;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author Gong Zhiyang
 * @date 2019/12/13
 */
@Mapper
@Repository
public interface ScoreTypeDao {
    /**
     * 新增评分类型
     *
     * @param scoreType 评分类型实体
     * @return 新增结果
     */
    @Insert("INSERT INTO score_type(score_name,max_score,type,state) VALUES(#{s.scoreName},#{s.maxScore},#{s.type},#{s.state})")
    @Options(useGeneratedKeys = true, keyProperty = "s.id", keyColumn = "id")
    int add(@Param("s") ScoreType scoreType);

    /**
     * 新增分数类型
     *
     * @param scoreTypeDetail 分数类型实体
     * @return 新增结果
     */
    @Insert("INSERT INTO score_type_detail(score_name,score,score_type_id) VALUES(#{s.scoreName},#{s.score},#{s.scoreTypeId})")
    int addScoreTypeDetail(@Param("s") ScoreTypeDetail scoreTypeDetail);

    /**
     * 删除评分类型
     *
     * @param id ID
     * @return 删除结果
     */
    @Delete("DELETE FROM score_type WHERE id=#{id}")
    int delete(@Param("id") int id);

    /**
     * 删除分数类型
     *
     * @param id ID
     * @return 删除结果
     */
    @Delete("DELETE FROM score_type_detail WHERE id=#{id}")
    int deleteScoreTypeDetail(@Param("id") int id);

    /**
     * 修改评分类型
     *
     * @param scoreType 评分类型
     * @return 新增结果
     */
    @Update("UPDATE score_type SET score_name=#{s.scoreName},max_score=#{s.maxScore} WHERE id=#{s.id}")
    int update(@Param("s") ScoreType scoreType);

    /**
     * 修改分数类型
     *
     * @param detail 分数类型
     * @return 新增结果
     */
    @Insert("INSERT INTO score_type_detail (id,score_name,score,score_type_id) VALUES(#{s.id},#{s.scoreName},#{s.score},#{s.scoreTypeId})" +
            " ON DUPLICATE KEY UPDATE score_name=#{s.scoreName},score=#{s.score}")
    int updateScoreTypeDetail(@Param("s") ScoreTypeDetail detail);

    /**
     * 查询分数类型列表
     *
     * @param id 评分类型ID
     * @return 分数类型列表
     */
    @Select("SELECT id,score_name as scoreName,score,score_type_id as scoreTypeId FROM score_type_detail WHERE score_type_id=#{id}")
    List<ScoreTypeDetail> getScoreTypeDetailList(@Param("id") int id);

    /**
     * 查询评分类型详情
     *
     * @param id 评分类型ID
     * @return 评分类型详情
     */
    @Select("SELECT id,score_name as scoreName,max_score as maxScore,type,state FROM score_type WHERE id=#{id}")
    ScoreType getScoreType(@Param("id") int id);

    /**
     * 修改评分类型状态
     *
     * @param id    评分类型ID
     * @param state 状态（0关闭，1开启）
     * @return 修改结果
     */
    @Update("UPDATE score_type SET state=#{state} WHERE id=#{id}")
    int updateState(@Param("id") int id, @Param("state") int state);

    /**
     * 查询评分类型列表
     *
     * @param scoreType 查询实体
     * @return 评分类型列表
     */
    @SelectProvider(type = ScoreTypeDaoProvider.class, method = "getScoreTypeList")
    List<ScoreType> getScoreTypeList(@Param("s") ScoreType scoreType);

    /**
     * 查询评分类型的使用次数
     *
     * @param id 评分id
     * @return 使用次数
     */
    @Select("SELECT COUNT(1) FROM score_detail WHERE score_type_id=#{id}")
    int getScoreTypeNum(@Param("id") Integer id);

    /**
     * 获取评分类型下拉列表
     *
     * @param type 类型（1优良，2负面，3严重失信）
     * @return 评分类型下拉列表
     */
    @Select("SELECT id,score_name as scoreName FROM score_type WHERE type=#{type}")
    List<ScoreType> getTypeList(@Param("type") int type);
    /**
     * 获取
     * 未关闭的
     * 评分类型下拉列表
     *
     * @param type 类型（1优良，2负面，3严重失信）
     * @return 评分类型下拉列表
     */
    @Select("SELECT id,score_name as scoreName FROM score_type WHERE type=#{type} and state =1")
    List<ScoreType> getOpenTypeList(@Param("type") int type);
}
